﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Data.OracleClient;
using System.Web.Configuration;

using MySql.Data.MySqlClient;
using Microsoft.AnalysisServices.AdomdClient;

using System.Timers;
using System.IO;



/// <summary>
/// Descripción breve de Manager
/// </summary>
public class Manager
{
	
		private string stringConexion;

        public Manager(string sc)
        {
            stringConexion = sc;
        }
        
        public DataSet obtenerGraficosParaActualizar()
        {
            SqlDataAdapter da = new SqlDataAdapter("sp_GetGraficosActualizables", stringConexion);
            DataSet ds = new DataSet();
            try
            {

                da.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return ds;
        }
     
        public void actualizarDatosGraf(DataRow datos_grafico) {
            try
            {
                //Creo una conexion a la base de datos y la abro
                SqlConnection conexion = new SqlConnection(stringConexion);
                conexion.Open();

                Grafico g = obtenerGraficoCalculando(datos_grafico);
                actualizarCabeceraGraf(datos_grafico.ItemArray[0].ToString(),datos_grafico.ItemArray[1].ToString(), g);
                actualizarDetalleGraf(datos_grafico.ItemArray[0].ToString(), datos_grafico.ItemArray[1].ToString(), g);

                //Creo un objeto SqlCommand en la conexion que acabo de crear para llamar al SP
               

                //Cierro la conexion
                conexion.Close();
            }
            catch (Exception ex)
            {
                //Propago la excepcion para poder mostrarla en pantalla
                throw ex;
            }
        }

        private void actualizarCabeceraGraf(string idGrupo, string nombre, Grafico g)
        {
            try
            {
                //Creo una conexion a la base de datos y la abro
                SqlConnection conexion = new SqlConnection(stringConexion);
                conexion.Open();
                SqlCommand cmd = new SqlCommand("sp_ActualizarValoresCabeceraGrafico", conexion);
                cmd.CommandType = CommandType.StoredProcedure;


                //Agrego los parametros necesarios en el llamado del SP
                SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar); param.Value = idGrupo; cmd.Parameters.Add(param);
                param = new SqlParameter("@nombre", SqlDbType.VarChar); param.Value = nombre; cmd.Parameters.Add(param);
                param = new SqlParameter("@titulo", SqlDbType.VarChar); param.Value = g.Titulo; cmd.Parameters.Add(param);
                param = new SqlParameter("@descripcion", SqlDbType.VarChar); param.Value = g.Descripcion; cmd.Parameters.Add(param);
                param = new SqlParameter("@tipo_grafico", SqlDbType.VarChar); param.Value = g.Tipo; cmd.Parameters.Add(param);
                param = new SqlParameter("@titulo_eje_x", SqlDbType.VarChar); param.Value = g.TituloEjeX; cmd.Parameters.Add(param);
                param = new SqlParameter("@titulo_eje_y", SqlDbType.VarChar); param.Value = g.TituloEjeY; cmd.Parameters.Add(param);
                param = new SqlParameter("@titulo_s1", SqlDbType.VarChar); param.Value = g.TituloSerie1; cmd.Parameters.Add(param);
                param = new SqlParameter("@titulo_s2", SqlDbType.VarChar); param.Value = g.TituloSerie2; cmd.Parameters.Add(param);
                param = new SqlParameter("@id_formato_valor", SqlDbType.VarChar); param.Value = g.FormatoValores; cmd.Parameters.Add(param);


                //Ejecuto el SP
                cmd.ExecuteNonQuery();
                conexion.Close();
            }
            catch (Exception ex)
            {
                StreamWriter sw2 = new StreamWriter("D:/errorGraficos.txt", true);
                sw2.WriteLine("error al guardar en nuevo valor de la cabecera del grafico: " + ex.Message);
                sw2.Close();
            }
        }

        private void actualizarDetalleGraf(string idGrupo, string nombre, Grafico g)
        {

            borrarValoresAnterioresGraf(idGrupo, nombre);
            agregarValoresNuevosGraf(idGrupo, nombre, g);
           
        
        }

        private void borrarValoresAnterioresGraf(string idGrupo, string nombre)
        {
             try
		{
			//Creo una conexion a la base de datos y la abro
			SqlConnection conexion = new SqlConnection(stringConexion);
			conexion.Open();
            SqlCommand cmd = new SqlCommand("sp_BorrarDetalleAntGrafico", conexion);
			cmd.CommandType = CommandType.StoredProcedure;


            SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar); param.Value = idGrupo; cmd.Parameters.Add(param);
            param = new SqlParameter("@nombre", SqlDbType.VarChar); param.Value = nombre; cmd.Parameters.Add(param);
            cmd.ExecuteNonQuery();
            conexion.Close();
        }
             catch (Exception ex)
             {
                 StreamWriter sw2 = new StreamWriter("D:/errorGraficos.txt", true);
                 sw2.WriteLine("error al borrar el detalle anterior del grafico: " + ex.Message);
                 sw2.Close();
             }
        }

        private void agregarValoresNuevosGraf(string idGrupo, string nombre, Grafico g)
        { try
		{
            SqlConnection conexion = new SqlConnection(stringConexion);
			conexion.Open();
            foreach (Valor v in g.Valores)
            {
                 SqlCommand cmd = new SqlCommand("sp_AgregarDetalleGrafico", conexion);
			     cmd.CommandType = CommandType.StoredProcedure;
			
                SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar); param.Value = idGrupo; cmd.Parameters.Add(param);
                param = new SqlParameter("@nombre", SqlDbType.VarChar); param.Value = nombre; cmd.Parameters.Add(param);
                param = new SqlParameter("@titulo_valor", SqlDbType.VarChar); param.Value = v.TituloValor; cmd.Parameters.Add(param);
                param = new SqlParameter("@valor_s1", SqlDbType.VarChar); param.Value = v.ValorS1; cmd.Parameters.Add(param);
                param = new SqlParameter("@valor_s2", SqlDbType.VarChar); param.Value = v.ValorS2; cmd.Parameters.Add(param);
                cmd.ExecuteNonQuery();
            }

            conexion.Close();
        }
        catch (Exception ex)
        {
            StreamWriter sw2 = new StreamWriter("D:/errorGraficos.txt", true);
            sw2.WriteLine("error al guardar en nuevo valor del detalle grafico: " + ex.Message);
            sw2.Close();
        }
  
        }

        public DataSet obtenerIndicadoresParaActualizar(){
            SqlDataAdapter da = new SqlDataAdapter("sp_GetIndicadoresActualizables", stringConexion);
            DataSet ds = new DataSet();
            try
            {

                da.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return ds;
        }
        
        public void actualizarDatosInd(DataRow datos){
     

            Indicador i = obtenerIndicadorCalculando(datos.ItemArray[0].ToString(), datos.ItemArray[1].ToString(), datos);
            StreamWriter sw = new StreamWriter("D:/logIndRecalculado.txt", true);
            sw.WriteLine(i.Nombre +" " + i.ValorActual+ " "+ i.Umbral + "");
            sw.Close();

            try
		{
			//Creo una conexion a la base de datos y la abro
			SqlConnection conexion = new SqlConnection(stringConexion);
			conexion.Open();
            SqlCommand cmd = new SqlCommand("sp_ActualizarValoresIndicador", conexion);
			cmd.CommandType = CommandType.StoredProcedure;

                
                
                SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar); param.Value = datos.ItemArray[0].ToString(); cmd.Parameters.Add(param);
                param = new SqlParameter("@nombre", SqlDbType.VarChar); param.Value = datos.ItemArray[1].ToString() ; cmd.Parameters.Add(param);
               
                param = new SqlParameter("@descripcion", SqlDbType.VarChar); param.Value = i.Descripcion; cmd.Parameters.Add(param);
                param = new SqlParameter("@valor", SqlDbType.Decimal); param.Value = i.ValorActual; cmd.Parameters.Add(param);
                param = new SqlParameter("@umbral", SqlDbType.Decimal); param.Value = i.Umbral; cmd.Parameters.Add(param);
                param = new SqlParameter("@variacion", SqlDbType.Decimal); param.Value = i.Variacion; cmd.Parameters.Add(param);
                param = new SqlParameter("@id_formato_valor_actual", SqlDbType.VarChar); param.Value = i.FormatoValor; cmd.Parameters.Add(param);
                param = new SqlParameter("@id_formato_valor_variacion", SqlDbType.VarChar); param.Value = i.FormatoVariacion; cmd.Parameters.Add(param);
                param = new SqlParameter("@minimo", SqlDbType.Decimal); param.Value = i.Minimo; cmd.Parameters.Add(param);
                param = new SqlParameter("@maximo", SqlDbType.Decimal); param.Value = i.Maximo; cmd.Parameters.Add(param);
                param = new SqlParameter("@estado_alarma", SqlDbType.VarChar); param.Value = i.Alarma; cmd.Parameters.Add(param);

                //Ejecuto el SP
                cmd.ExecuteNonQuery();
                
                conexion.Close();
        }
            catch (Exception ex)
            {
                StreamWriter sw2 = new StreamWriter("D:/error.txt", true);
                sw2.WriteLine("error al guardar en nuevo valor del indicador: " + ex.Message);
                sw2.Close();
            }


        }

        public Resultado[] ObtenerValores(string idGrupo)
        {

            DataSet kpis = getNombresIndicadores(idGrupo); //tiene solo el nombre de cada kpi
            ArrayList datos_kpis = new ArrayList();
            string nombre_kpi;

            DataSet datos;



            foreach (DataRow i in kpis.Tables[0].Rows)
            {
                Resultado r;
                Indicador k;
                Grafico g = null;
                nombre_kpi = (string)i.ItemArray[0];
                datos = getDatosIndicador(idGrupo, nombre_kpi);
                if (decimal.Parse(datos.Tables[0].Rows[0].ItemArray[11].ToString()) > 0)//si los datos los saca de la BD
                    k = obtenerIndicadorDeBD(idGrupo, nombre_kpi);

                else
                {
                    k = obtenerIndicadorCalculando(idGrupo, nombre_kpi, datos.Tables[0].Rows[0]);

                }
                if (necesitaGrafico(idGrupo, nombre_kpi))
                    g = getGrafico(idGrupo, nombre_kpi);
                r = new Resultado();
                r.Indicador = k;
                r.Grafico = g;

                datos_kpis.Add(r);
            }

            Resultado[] resultados = new Resultado[datos_kpis.Count];

            for (int i = 0; i < datos_kpis.Count; i++)
            {
                resultados[i] = (Resultado)datos_kpis[i];
            }

            return resultados;
        }

		private DataSet getNombresIndicadores(string idGrupo)
		{

			SqlDataAdapter da = new SqlDataAdapter("sp_GetKPIs", stringConexion);//devuelve solo los nombres

			da.SelectCommand.CommandType = CommandType.StoredProcedure;

			SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar);
			param.Value = idGrupo;

			da.SelectCommand.Parameters.Add(param);

			DataSet ds = new DataSet();
			try
			{

				da.Fill(ds);
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return ds;
		}

		private DataSet getDatosIndicador(string idGrupo, string nombre_kpi)
		{
			SqlDataAdapter da = new SqlDataAdapter("sp_GetDatosIndicador", stringConexion);
			da.SelectCommand.CommandType = CommandType.StoredProcedure;

			SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar);
			param.Value = idGrupo;

			SqlParameter param2 = new SqlParameter("@nombre_kpi", SqlDbType.VarChar);
			param2.Value = nombre_kpi;

			da.SelectCommand.Parameters.Add(param);
			da.SelectCommand.Parameters.Add(param2);

			DataSet datos = new DataSet();
			try
			{
				da.Fill(datos);
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return datos;
		}

        private DataSet getValorIndicador(string idGrupo, string nombre, DataRow datos)
		{

			DataSet resultado;

            string conexion = datos.ItemArray[4].ToString();
            string query = datos.ItemArray[5].ToString(); 
            string fuente = datos.ItemArray[3].ToString(); ;
			try
			{
				resultado = realizarQuery(query, fuente, conexion);

			}
			catch (Exception ex)
			{
				throw ex;
			}

			return resultado;

		}

		private DataSet realizarQuery(string sel, string proveedor, string conexion)//segun el pushbi devuelve fecha,valor,umbral
		{
			DataSet ds = new DataSet();
			if (proveedor == "SQLSERVR")
			{
				SqlDataAdapter da = new SqlDataAdapter(sel, conexion);
				try
				{
					da.Fill(ds);
				}
				catch (Exception ex)
				{
					throw ex;
				}

				return ds;
			}
            else if (proveedor == "MYSQL")
			{
				MySqlDataAdapter a = new MySqlDataAdapter(sel, conexion);
				try
				{
					a.Fill(ds);
				}
				catch (Exception ex)
				{
					throw ex;
				}

				return ds;
			}
            else if (proveedor == "ORCL")
            {
                OracleDataAdapter oda = new OracleDataAdapter(sel, conexion);
                try
                {
                    oda.Fill(ds);
                }
                catch (Exception ex)
                {
                    throw ex;
                }

                return ds;
            }
            else//proveedor==SQLSERVROLAP
            {
                AdomdDataAdapter olapda = new AdomdDataAdapter(sel, conexion);
                try
                {
                    olapda.Fill(ds);
                }
                catch (Exception ex)
                {
                    throw ex;
                }

                return ds;
            }
		}

		private decimal getVariacion(decimal valor, decimal valor_esperado, string formato_variacion) //el valor esperado se saca de dataset.tables[3] del select del kpi
		{
			if (formato_variacion != "porcentaje")
				return valor - valor_esperado;
			else
				return ((valor - valor_esperado) * 100) / valor_esperado;

		}

		private string getAlarma(decimal valor, decimal maximo, decimal minimo, string max_min)
		{
			if (max_min == "MAX")
			{
				if (valor < minimo)
					return "malo";
				else if (valor > maximo)
					return "bueno";
				else
					return "medio";//esta entre el minimo y el maximo
			}
			else
			{
				if (valor > maximo)
					return "malo";
				else if (valor < minimo)
					return "bueno";
				else
					return "medio";//esta entre el minimo y el maximo
			}
		}

        private Indicador obtenerIndicadorCalculando(string idGrupo, string nombre_kpi, DataRow datos)
        {
            string formato_variacion;
            decimal valor;
            decimal valor_esperado;
            Indicador k = new Indicador();
            DataSet res_consulta = getValorIndicador(idGrupo, nombre_kpi, datos);
            valor = decimal.Parse(res_consulta.Tables[0].Rows[0].ItemArray[0].ToString()); //Supuestamente 0=valor,1=umbral
            valor_esperado = decimal.Parse(res_consulta.Tables[0].Rows[0].ItemArray[1].ToString());
            formato_variacion = datos.ItemArray[10].ToString();
            k.Descripcion = datos.ItemArray[2].ToString();
            k.Umbral = valor_esperado;
            k.Nombre = nombre_kpi;
            k.ValorActual = valor;
            k.FormatoVariacion = formato_variacion;
            k.FormatoValor = datos.ItemArray[9].ToString();
            k.Alarma = getAlarma(valor, decimal.Parse(datos.ItemArray[7].ToString()), decimal.Parse(datos.ItemArray[6].ToString()), datos.ItemArray[8].ToString());
            k.Variacion = getVariacion(valor, valor_esperado, formato_variacion);
            k.Maximo = decimal.Parse(datos.ItemArray[7].ToString());
            k.Minimo = decimal.Parse(datos.ItemArray[6].ToString());
            return k;
        }

        private Indicador obtenerIndicadorDeBD(string idGrupo, string nombre_kpi) {
            DataSet valoresIndicador = obtenerValoresIndicadorDeBD(idGrupo, nombre_kpi);
        Indicador i = new Indicador();
        i.Nombre=nombre_kpi;
        i.Descripcion=valoresIndicador.Tables[0].Rows[0].ItemArray[2].ToString();
        i.ValorActual=decimal.Parse(valoresIndicador.Tables[0].Rows[0].ItemArray[3].ToString());
        i.Umbral=decimal.Parse(valoresIndicador.Tables[0].Rows[0].ItemArray[4].ToString());
        i.Variacion=decimal.Parse(valoresIndicador.Tables[0].Rows[0].ItemArray[5].ToString());
        i.Minimo = decimal.Parse(valoresIndicador.Tables[0].Rows[0].ItemArray[6].ToString());
        i.Maximo = decimal.Parse(valoresIndicador.Tables[0].Rows[0].ItemArray[7].ToString());
        i.FormatoValor = valoresIndicador.Tables[0].Rows[0].ItemArray[8].ToString();
        i.FormatoVariacion = valoresIndicador.Tables[0].Rows[0].ItemArray[9].ToString();
        i.Alarma = valoresIndicador.Tables[0].Rows[0].ItemArray[10].ToString();
        return i;

        }

        private DataSet obtenerValoresIndicadorDeBD(string idGrupo, string nombre_kpi) {
        
        SqlDataAdapter da = new SqlDataAdapter("sp_GetValoresIndicador", stringConexion);
        da.SelectCommand.CommandType = CommandType.StoredProcedure;

        SqlParameter param = new SqlParameter("@id_Grupo", SqlDbType.VarChar);
        param.Value = idGrupo;

        SqlParameter param2 = new SqlParameter("@nombre_kpi", SqlDbType.VarChar);
        param2.Value = nombre_kpi;

        da.SelectCommand.Parameters.Add(param);
        da.SelectCommand.Parameters.Add(param2);
        DataSet datos = new DataSet();
        try
        {
            da.Fill(datos);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return datos;
    }

        private bool necesitaGrafico(string idGrupo,string nombre_kpi){
        DataSet datos_grafico = getDemandaGrafico(idGrupo, nombre_kpi);
        if (datos_grafico.Tables[0].Rows.Count > 0)//si tiene un grafico asociado
            if (int.Parse(datos_grafico.Tables[0].Rows[0].ItemArray[0].ToString())==0)//si se tiene q enviar junto al indicador
                return true;
    return false;
    }
   
        private DataSet getDemandaGrafico(string idGrupo, string nombre_kpi)
    {
        SqlDataAdapter da = new SqlDataAdapter("sp_GetDemandaGrafico", stringConexion);

        da.SelectCommand.CommandType = CommandType.StoredProcedure;

        SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar);
        param.Value = idGrupo;

        SqlParameter param2 = new SqlParameter("@nombre_kpi", SqlDbType.VarChar);
        param2.Value = nombre_kpi;

        da.SelectCommand.Parameters.Add(param);
        da.SelectCommand.Parameters.Add(param2);

        DataSet ds = new DataSet();
        try
        {

            da.Fill(ds);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return ds;
    }

        public Grafico getGrafico(string idGrupo,string nombre_kpi){
        Grafico g = null;
        DataSet datos_grafico = getDatosGrafico(idGrupo, nombre_kpi);
        if (datos_grafico.Tables[0].Rows.Count > 0)//si tiene un grafico asociado
            if(decimal.Parse(datos_grafico.Tables[0].Rows[0].ItemArray[15].ToString())> 0)//si queiere los valores de la bd
                g = obtenerGraficoDeBD(idGrupo, datos_grafico.Tables[0].Rows[0].ItemArray[1].ToString());
            else
                g= obtenerGraficoCalculando(datos_grafico.Tables[0].Rows[0]);
       return g;  
    }

        private Grafico obtenerGraficoCalculando(DataRow datos_grafico)
    {
        Grafico g = new Grafico();
        g.Titulo = datos_grafico.ItemArray[2].ToString();
        g.Descripcion = datos_grafico.ItemArray[3].ToString();
        g.Tipo = datos_grafico.ItemArray[7].ToString();
        g.FormatoValores = datos_grafico.ItemArray[8].ToString();
        g.TituloEjeX = datos_grafico.ItemArray[9].ToString();
        g.TituloEjeY = datos_grafico.ItemArray[10].ToString();
        g.TituloSerie1 = datos_grafico.ItemArray[11].ToString();
        g.TituloSerie1 = datos_grafico.ItemArray[12].ToString();
        Valor[] valores = getValoresGrafico(datos_grafico.ItemArray[4].ToString(),//fuente datos
                                                datos_grafico.ItemArray[5].ToString(),//string conexion
                                                datos_grafico.ItemArray[6].ToString(),//query
                                                datos_grafico.ItemArray[7].ToString());//tipo de grafico
        g.Valores = valores;
        return g;
    
    }

        private Grafico obtenerGraficoDeBD(string idGrupo,string nombre){
            DataSet valoresCabeceraGrafico = ObtenerValoresCabeceraGraficoDeBD(idGrupo, nombre);
        
        Grafico g=new Grafico();
        g.Titulo=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[2].ToString();
        g.Descripcion=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[3].ToString();
        g.Tipo=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[4].ToString();
        g.TituloEjeX=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[5].ToString();
        g.TituloEjeY=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[6].ToString();
        g.TituloSerie1=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[7].ToString();
        g.TituloSerie2=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[8].ToString();
        g.FormatoValores=valoresCabeceraGrafico.Tables[0].Rows[0].ItemArray[9].ToString();
        Valor[] valores= getValoresGraficoDeBD(idGrupo,nombre);
        g.Valores = valores;
        return g;
        
    }
   
        private Valor[] getValoresGraficoDeBD(string idGrupo, string nombre) {
            DataSet valoresDetalleGrafico = ObtenerValoresDetalleGraficoDeBD(idGrupo, nombre);
       Valor[] valores = new Valor[valoresDetalleGrafico.Tables[0].Rows.Count];
       ArrayList aux = new ArrayList();
       foreach (DataRow d in valoresDetalleGrafico.Tables[0].Rows)
        {
            Valor v = new Valor();
            v.TituloValor = d.ItemArray[0].ToString();
            v.ValorS1 = decimal.Parse(d.ItemArray[1].ToString());
            v.ValorS2 = decimal.Parse(d.ItemArray[2].ToString());
            aux.Add(v);
       }
       for (int i = 0; i < aux.Count; i++)
       {
           valores[i] = (Valor)aux[i];
       }
       return valores;
    }

        private DataSet ObtenerValoresCabeceraGraficoDeBD(string idGrupo, string nombre)
        {
        SqlDataAdapter da = new SqlDataAdapter("sp_GetCabeceraGrafico", stringConexion);

        da.SelectCommand.CommandType = CommandType.StoredProcedure;

        SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar);
        param.Value = idGrupo;

        SqlParameter param2 = new SqlParameter("@nombre", SqlDbType.VarChar);
        param2.Value = nombre;

        da.SelectCommand.Parameters.Add(param);
        da.SelectCommand.Parameters.Add(param2);

        DataSet ds = new DataSet();
        try
        {

            da.Fill(ds);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return ds;
    }

        private DataSet ObtenerValoresDetalleGraficoDeBD(string idGrupo, string nombre)
    {
        SqlDataAdapter da = new SqlDataAdapter("sp_GetDetalleGrafico", stringConexion);

        da.SelectCommand.CommandType = CommandType.StoredProcedure;

        SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar);
        param.Value = idGrupo;
         

        SqlParameter param2 = new SqlParameter("@nombre", SqlDbType.VarChar);
        param2.Value = nombre;

        da.SelectCommand.Parameters.Add(param);
        da.SelectCommand.Parameters.Add(param2);

        DataSet ds = new DataSet();
        try
        {

            da.Fill(ds);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return ds;
    }

        private Valor[] getValoresGrafico(string fuente, string conexion, string query,string tipo) {
        Valor[] valores;
        DataSet resultado;
         try
        {
            resultado = realizarQuery(query, fuente, conexion);

        }
        catch (Exception ex)
        {
            throw ex;
        }

         valores = llenarValores(resultado, tipo, resultado.Tables[0].Rows.Count);
         return valores;
    }

        private Valor[] llenarValores(DataSet resultado, string tipo, int cantValores){
        Valor[] valores = new Valor[cantValores];
        ArrayList l = new ArrayList();
        if (tipo == "TOR") 
            foreach (DataRow fila in resultado.Tables[0].Rows)
            {
                Valor v = new Valor();
                v.TituloValor = fila.ItemArray[0].ToString();
                v.ValorS1 = decimal.Parse(fila.ItemArray[1].ToString());
                l.Add(v);
             }
        else
            foreach (DataRow fila in resultado.Tables[0].Rows)
            {
                Valor v = new Valor();
                v.TituloValor = fila.ItemArray[0].ToString();
                v.ValorS1 = decimal.Parse(fila.ItemArray[1].ToString());
                v.ValorS2 = decimal.Parse(fila.ItemArray[2].ToString());
                l.Add(v);
            }
      

        for (int i = 0; i < l.Count; i++)
            valores[i] = (Valor)l[i];
            
        return valores;       
        
    }
    
        private DataSet getDatosGrafico(string idGrupo, string nombre_kpi)
    {
        SqlDataAdapter da = new SqlDataAdapter("sp_GetGrafico", stringConexion);

        da.SelectCommand.CommandType = CommandType.StoredProcedure;

        SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar);
        param.Value = idGrupo;

        SqlParameter param2 = new SqlParameter("@nombre_kpi", SqlDbType.VarChar);
        param2.Value = nombre_kpi;

        da.SelectCommand.Parameters.Add(param);
        da.SelectCommand.Parameters.Add(param2);

        DataSet ds = new DataSet();
        try
        {

            da.Fill(ds);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return ds;
    }

        public bool pertenece(string idGrupo, string usuario)
        {
            DataSet ds = getInfoUsuarioGrupo(idGrupo, usuario);
            if (ds.Tables[0].Rows.Count > 0)
                return true;
            return false;
        }

        private DataSet getInfoUsuarioGrupo(string idGrupo, string usuario)
        {
            SqlDataAdapter da = new SqlDataAdapter("sp_GetGrupoUsuario", stringConexion);//devuelve solo los nombres

            da.SelectCommand.CommandType = CommandType.StoredProcedure;

            SqlParameter param = new SqlParameter("@id_grupo", SqlDbType.VarChar);
            param.Value = idGrupo;
            SqlParameter param2 = new SqlParameter("@usuario", SqlDbType.VarChar);
            param2.Value = usuario;






            da.SelectCommand.Parameters.Add(param);
            da.SelectCommand.Parameters.Add(param2);

            DataSet ds = new DataSet();
            try
            {

                da.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return ds;
        }

        public bool autenticarUsuario(string usuario, string contrasenia)
        {
            SqlDataAdapter da = new SqlDataAdapter("sp_GetDatosLogin", stringConexion);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;

            SqlParameter param = new SqlParameter("@usuario", SqlDbType.VarChar);
            param.Value = usuario;

            SqlParameter param2 = new SqlParameter("@contrasenia", SqlDbType.VarChar);
            param2.Value = contrasenia;

            da.SelectCommand.Parameters.Add(param);
            da.SelectCommand.Parameters.Add(param2);
            DataSet datos = new DataSet();
            try
            {
                da.Fill(datos);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            if (datos.Tables[0].Rows.Count == 0)
                return false;
            else
                return true;
        }





}
